package string;

/**
 * 字符串是不变对象,一旦修改内容会创建新的对象
 *
 * JVM对字符串的一个优化措施:字符串常量池
 * 字符串常量池是JVM在堆内存(JDK8之后,之前是在方法区)中开辟一块空间,用来缓存
 * 所有使用字面量形式创建的字符串对象,并进行中庸.这样可以减少笔不要的内存开销
 */
public class StringDemo {
    public static void main(String[] args) {
        String s1 = "123abc";
        String s2 = "123abc";//重用s1对象
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s1==s2);//true,地址相同说明只想同一个字符串对象

        /*
            常见面试题,下面语句创建了几个字符串对象?
            如果没有上面的内容,只有下面这句代码那么创建了两个字符串对象
            对一个:"123abc"这个字面创建的字符串对象
            第二个:new String()创建的字符串对象

         */

        String s4 = new String("123abc");
        System.out.println(s4);
        System.out.println(s2==s4);//false

        System.out.println(s2.equals(s4));//true    字符串内容比较操作

        /*

         */
        String s5 = "123" + "abc";
        System.out.println("s5:"+s5);
        System.out.println(s2==s5);//true

        String s = "123";
        String s6 = s + "abc";
        System.out.println("s6:"+s6);
        System.out.println(s2==s6);//false

        String s8 = '1'+2+"3"+"abc";
        System.out.println("s8:"+s8);
        System.out.println(s2==s8);//false

        String s9 = "1"+2+"3"+"abc";
        System.out.println("s9:"+s9);
        System.out.println(s2==s9);


    }
}
